/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package NovoGame.Blocos;
import NovoGame.Menu;
import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
public class BlocosJogo extends GameCanvas implements Runnable{
    boolean jogar;
    boolean jogarIniciarBola;
    int altura;
    int largura;
    int centroX=0;
    int centroY=0;
    int posicaoX=0;
    int posicaoY=0;
    int posicoesMaxX;
    int posicoesMaxY;
    int teclapressionada = 0;
    int vidas = 10;
    Image fundoInicio;
    Image fundo;
    Menu meuJogo;
    String debug;
    BlocosBloco blocos[][];
    BlocosSeleciona selecionado;
    int blocosX[] = new int[1];
    int blocosY[] = new int[1];
    
    public BlocosJogo(boolean teclaEventos, Menu meuJogo){
        super(teclaEventos);
        this.meuJogo = meuJogo;
        this.jogar = true;
    }
    public void inicio(){
        altura = getHeight();
        largura = getWidth();
        posicoesMaxX = (largura/11)-2;
        posicoesMaxY = ((altura)/11)-3;
        Random aleatorio = new Random();
        blocos = new BlocosBloco[posicoesMaxX][posicoesMaxY];
        BlocosBloco bloco = new BlocosBloco();
        centroX = ((largura-(bloco.getLargura()*posicoesMaxX))/2)-posicoesMaxX/2;
        centroY = ((altura-(bloco.getAltura()*posicoesMaxY))/2)-(posicoesMaxY/2)+10;
        int i=0;
        for(int a=0; a<posicoesMaxX; a++){
            for(int e=0; e<posicoesMaxY; e++){
                aleatorio.setSeed(System.currentTimeMillis()+(i*i));
                int n = Math.abs(aleatorio.nextInt()%2)+1;
                bloco.setX((a*(bloco.getLargura()+1))+centroX);
                bloco.setY((e*bloco.getAltura())+e+centroY);
                bloco.setTipo(n);
                bloco.setAtivo(true);
                this.blocos[a][e] = bloco;
                bloco = new BlocosBloco();
                i++;
            }
        }
        selecionado = new BlocosSeleciona();
        selecionado.setX(blocos[posicaoX][posicaoY].getX()-1);
        selecionado.setY(blocos[posicaoX][posicaoY].getY()-1);
    }
    public void start(){
        jogar = true;
        Thread t = new Thread(this);
        t.start();
    }
    public void stop(){
        jogar = false;
        vidas=0;
    }
    public void run(){
        inicio();
        while(jogar){
            atualizaStatusJogo();
            atualizaTelaJogo(this.getGraphics());
            this.flushGraphics();
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        //meuJogo.fimJogo(vidas, pontos, tempo);
    }
    // Verifica interação do usuário
    protected void keyPressed(int keyCode){
        super.keyPressed(keyCode);
        /*
        switch(getGameAction(keyCode)){
            case FIRE:
            case FIRE_PRESSED:
                this.setAtirar(this.selecionado.getX()+5, this.selecionado.getY()+5);
            break;
        }
        */
        switch (getGameAction(keyCode)){
            case FIRE:
                debug = ("FIRE pressed");
            break;
            case UP:
                debug = ("UP pressed");
            break;
            case DOWN:
                debug = ("DOWN pressed");
            break;
            case LEFT:
                debug = ("LEFT pressed");
            break;
            case RIGHT:
                debug = ("RIGHT pressed");
            break;
            case GAME_A:
                debug = ("GAME_A pressed");
            break;
            case GAME_B:
                debug = ("GAME_B pressed");
            break;
            case GAME_C:
                debug = ("GAME_C pressed");
            break;
            case GAME_D:
                debug = ("GAME_D pressed");
            break;
        }
    }
    protected void keyReleased(int keyCode){
        int gameAction = getGameAction(keyCode);
        switch(gameAction){
            case LEFT:
                posicaoX --;
                if(posicaoX < 0){
                    posicaoX = 0;
                }
            break;
            case RIGHT:
                posicaoX ++;
                if(posicaoX >= posicoesMaxX){
                    posicaoX = posicoesMaxX-1;
                }
            break;
            case DOWN:
                posicaoY ++;
                if(posicaoY >= posicoesMaxY){
                    posicaoY = posicoesMaxY-1;
                }
            break;
            case UP:
                posicaoY --;
                if(posicaoY < 0){
                    posicaoY = 0;
                }
            break;
            case FIRE_PRESSED:
            case FIRE:
                this.setAtirar(this.selecionado.getX()+5, this.selecionado.getY()+5);
            break;
        }
        switch(keyCode){
            case KEY_NUM2:
                posicaoY --;
                if(posicaoY < 0){
                    posicaoY = 0;
                }
            break;
            case KEY_NUM4:
                posicaoX --;
                if(posicaoX < 0){
                    posicaoX = 0;
                }
            break;
            case 103:
            case KEY_NUM5:
                this.setAtirar(this.selecionado.getX()+5, this.selecionado.getY()+5);
            break;
            case 104:
            case KEY_NUM6:
                posicaoX ++;
                if(posicaoX >= posicoesMaxX){
                    posicaoX = posicoesMaxX-1;
                }
            break;
            case KEY_NUM8:
                posicaoY ++;
                if(posicaoY >= posicoesMaxY){
                    posicaoY = posicoesMaxY-1;
                }
            break;
        }
    }
    protected void pointerPressed(int x, int y) {
        this.encontraPosicaoSeleciona(x, y);
    }
    protected void pointerReleased(int x, int y){
        this.setAtirar(x, y);
    }
    protected void pointerDragged(int x, int y) {
        this.encontraPosicaoSeleciona(x, y);
    }
    //Evento para começar ou disparar
    private void setAtirar(int x, int y){
        this.encontraPosicaoSeleciona(x, y);
        this.removerBlocosSelecionados();
    }
    //Atualiza os elementos do jogo.. Posição, Colisão...
    private void atualizaStatusJogo(){
        this.removeBlocosStatusSelecionado();
        this.reorganizarBlocosSeparados();
        selecionado.setX(blocos[posicaoX][posicaoY].getX()-1);
        selecionado.setY(blocos[posicaoX][posicaoY].getY()-1);
        this.encontraBlocosSelecionados();
    }
    private void atualizaTelaJogo(Graphics g){
        g.setColor(255,255,255);
        g.fillRect(0, 0, largura, altura);
        g.setColor(0,0,0);
        g.drawString("Ponto: "+debug, 0, 0, Graphics.TOP|Graphics.LEFT);
        for(int a=0; a<posicoesMaxX; a++){
            for(int e=0; e<posicoesMaxY; e++){
                this.blocos[a][e].pintar(g);
            }
        }
        selecionado.pintar(g);
    }
    private void encontraPosicaoSeleciona(int x, int y){
        int posicaoIntX = this.blocos[0][0].getLargura()+1;
        int posicaoIntY = this.blocos[0][0].getAltura()+1;
        int totalPosicaoIntX = (centroX+(posicaoIntX*posicoesMaxX));
        int totalPosicaoIntY = (centroY+(posicaoIntY*posicoesMaxY));
        //Definir posição do eixo X
        if(x <= centroX+posicaoIntX){
            posicaoX = 0;
        }else if(x>=totalPosicaoIntX-posicaoIntX){
            posicaoX = posicoesMaxX-1;
        }else{
            int i = posicoesMaxX-1;
            for(; i > 0; i--){
                if(x-centroX >=i*posicaoIntX){
                    break;
                }
            }
            posicaoX = i;
        }
        //Definir posição do eixo Y
        if(y <= centroY+posicaoIntY){
            posicaoY = 0;
        }else if(y>=totalPosicaoIntY-posicaoIntY){
            posicaoY = posicoesMaxY-1;
        }else{
            int i = posicoesMaxY-1;
            for(; i > 0; i--){
                if(y-centroY >=i*posicaoIntY){
                    break;
                }
            }
            posicaoY = i;
        }
    }
    private void removeBlocosStatusSelecionado(){
        for(int a=0; a<posicoesMaxX; a++){
            for(int e=0; e<posicoesMaxY; e++){
                this.blocos[a][e].setSelecionado(false);
            }
        }
    }
    private void removerBlocosSelecionados(){
        if(blocosX.length > 1){
            for(int i=0; i<blocosX.length; i++){
                blocos[blocosX[i]][blocosY[i]].setAtivo(false);
            }
        }
        blocosParaBaixo();
    }
    private void encontraBlocosSelecionados(){
        int blocosAX[] = new int[1];
        int blocosAY[] = new int[1];
        blocosAX[0] = posicaoX;
        blocosAY[0] = posicaoY;
        blocosX = blocosAX;
        blocosY = blocosAY;
        if(blocos[posicaoX][posicaoY].getAtivo()){
            this.encontrarBlocosBaixo(posicaoX, posicaoY+1);
            this.encontrarBlocosCima(posicaoX, posicaoY-1);
            this.encontrarBlocosDireita(posicaoX+1, posicaoY);
            this.encontrarBlocosEsquerda(posicaoX-1, posicaoY);
            if(blocosX.length > 1){
                for(int i=0; i<blocosX.length; i++){
                    blocos[blocosX[i]][blocosY[i]].setSelecionado(true);
                }
            }
        }
    }
    private void encontrarBlocosBaixo(int posicaoIntX, int posicaoIntY){
        for(; posicaoIntY <posicoesMaxY; posicaoIntY++){
            if(this.blocos[posicaoIntX][posicaoIntY].getAtivo() && this.blocos[blocosX[0]][blocosY[0]].getTipo() == this.blocos[posicaoIntX][posicaoIntY].getTipo() && !this.estaSelecionado(posicaoIntX, posicaoIntY)){
                int blocosAX[] = new int[blocosX.length+1];
                int blocosAY[] = new int[blocosY.length+1];
                int i = 0;
                for(;i<blocosX.length; i++){
                    blocosAX[i] = blocosX[i];
                    blocosAY[i] = blocosY[i];
                }
                blocosAX[i] = posicaoIntX;
                blocosAY[i] = posicaoIntY;
                blocosX = blocosAX;
                blocosY = blocosAY;
                this.encontrarBlocosDireita(posicaoIntX+1, posicaoIntY);
                this.encontrarBlocosEsquerda(posicaoIntX-1, posicaoIntY);
            }else{
                break;
            }
        }
    }
    private void encontrarBlocosCima(int posicaoIntX, int posicaoIntY){
        for(; posicaoIntY >=0; posicaoIntY--){
            if(this.blocos[posicaoIntX][posicaoIntY].getAtivo() && this.blocos[blocosX[0]][blocosY[0]].getTipo() == this.blocos[posicaoIntX][posicaoIntY].getTipo() && !estaSelecionado(posicaoIntX, posicaoIntY)){
                int blocosAX[] = new int[blocosX.length+1];
                int blocosAY[] = new int[blocosY.length+1];
                int i = 0;
                for(;i<blocosX.length; i++){
                    blocosAX[i] = blocosX[i];
                    blocosAY[i] = blocosY[i];
                }
                blocosAX[i] = posicaoIntX;
                blocosAY[i] = posicaoIntY;
                blocosX = blocosAX;
                blocosY = blocosAY;
                this.encontrarBlocosDireita(posicaoIntX+1, posicaoIntY);
                this.encontrarBlocosEsquerda(posicaoIntX-1, posicaoIntY);
            }else{
                break;
            }
        }
    }
    private void encontrarBlocosDireita(int posicaoIntX, int posicaoIntY){
        for(; posicaoIntX <posicoesMaxX; posicaoIntX++){
            if(this.blocos[posicaoIntX][posicaoIntY].getAtivo() && this.blocos[blocosX[0]][blocosY[0]].getTipo() == this.blocos[posicaoIntX][posicaoIntY].getTipo() && !estaSelecionado(posicaoIntX, posicaoIntY)){
                int blocosAX[] = new int[blocosX.length+1];
                int blocosAY[] = new int[blocosY.length+1];
                int i = 0;
                for(;i<blocosX.length; i++){
                    blocosAX[i] = blocosX[i];
                    blocosAY[i] = blocosY[i];
                }
                blocosAX[i] = posicaoIntX;
                blocosAY[i] = posicaoIntY;
                blocosX = blocosAX;
                blocosY = blocosAY;
                this.encontrarBlocosBaixo(posicaoIntX, posicaoIntY+1);
                this.encontrarBlocosCima(posicaoIntX, posicaoIntY-1);
            }else{
                break;
            }
        }
    }
    private void encontrarBlocosEsquerda(int posicaoIntX, int posicaoIntY){
        for(; posicaoIntX >=0; posicaoIntX--){
            if(this.blocos[posicaoIntX][posicaoIntY].getAtivo() && this.blocos[blocosX[0]][blocosY[0]].getTipo() == this.blocos[posicaoIntX][posicaoIntY].getTipo() && !estaSelecionado(posicaoIntX, posicaoIntY)){
                int blocosAX[] = new int[blocosX.length+1];
                int blocosAY[] = new int[blocosY.length+1];
                int i = 0;
                for(;i<blocosX.length; i++){
                    blocosAX[i] = blocosX[i];
                    blocosAY[i] = blocosY[i];
                }
                blocosAX[i] = posicaoIntX;
                blocosAY[i] = posicaoIntY;
                blocosX = blocosAX;
                blocosY = blocosAY;
                this.encontrarBlocosBaixo(posicaoIntX, posicaoIntY+1);
                this.encontrarBlocosCima(posicaoIntX, posicaoIntY-1);
            }else{
                break;
            }
        }
    }
    private boolean estaSelecionado(int posicaoX, int posicaoY){
        for(int i=0; i<blocosX.length; i++){
            if(blocosX[i] == posicaoX && blocosY[i] == posicaoY){
                return true;
            }
        }
        return false;
    }
    private void blocosParaBaixo(){
        int blocosTipo[] = new int[posicoesMaxY];
        for(int x=0; x<posicoesMaxX; x++){
            int totalVazio = 0;
            int z=0;
            for(int y=0; y<posicoesMaxY; y++){
                if(this.blocos[x][y].getAtivo()){
                    blocosTipo[z] = this.blocos[x][y].getTipo();
                    z++;
                }else{
                    totalVazio++;
                }
            }
            for(int y=0; y<posicoesMaxY; y++){
                this.blocos[x][y].setAtivo(false);
            }
            int zA=0;
            for(int y=totalVazio; y<posicoesMaxY; y++){
                this.blocos[x][y].setAtivo(true);
                this.blocos[x][y].setTipo(blocosTipo[zA]);
                zA++;
            }
        }
    }
    private void reorganizarBlocosSeparados(){
        int colunas = 0;
        for(int x=0; x<posicoesMaxX; x++){
            if(this.blocos[x][posicoesMaxY-1].getAtivo()){
                colunas++;
            }
        }
        if(colunas < this.blocos.length){
            int intX = 0;
            BlocosBloco blocosInt[][] = new BlocosBloco[colunas][posicoesMaxY];
            for(int x=0; x<posicoesMaxX; x++){
                if(this.blocos[x][posicoesMaxY-1].getAtivo()){
                    for(int y=0; y<posicoesMaxY;y++){
                        blocosInt[intX][y] = this.blocos[x][y];
                    }
                    intX++;
                }
            }
            posicoesMaxX = blocosInt.length;
            this.blocos = blocosInt;
            if(this.blocos.length == 0){
                this.inicio();
            }
            centroX = ((largura-(this.blocos[0][0].getLargura()*posicoesMaxX))/2)-posicoesMaxX/2;
            for(int x=0; x<posicoesMaxX; x++){
                for(int y=0; y<posicoesMaxY; y++){
                    this.blocos[x][y].setX((x*(this.blocos[0][0].getLargura()+1))+centroX);
                    this.blocos[x][y].setY((y*this.blocos[0][0].getAltura())+y+centroY);
                }
            }
            if(posicaoX>=posicoesMaxX){
                posicaoX = posicoesMaxX-1;
            }
        }
    }
}